/*
 * @Author: ljkt
 * @Version: 2.0
 * @Date: 2022-05-16 11:06:33
 * @LastEditors: ljkt
 * @LastEditTime: 2025-01-26 21:02:59
 * @Description: UART硬件抽象层
 */

#include "./Hal/mcu_example/Hal_Common_Func.h"

#if defined(EN_UART0) || defined(EN_UART1) || defined(EN_UART2) || defined(EN_UART3)

/**
 * @brief 初始化UART硬件
 * @param config UART配置结构体指针
 * @note 配置GPIO引脚并设置UART硬件
 */
void Hal_Uartx_Init(s_uartx_config_t *config)
{
	Hal_Gpio_In(&config->gpio_rx);
	Hal_Gpio_Out(&config->gpio_tx, config->level);

	switch (config->index)
	{
#ifdef EN_UART0
	case e_HAL_UART_0:
		// TODO: 实现UART0波特率和中断配置
		break;
#endif
#ifdef EN_UART1
	case e_HAL_UART_1:
		// TODO: 实现UART1波特率和中断配置
		break;
#endif
#ifdef EN_UART2
	case e_HAL_UART_2:
		// TODO: 实现UART2波特率和中断配置
		break;
#endif
#ifdef EN_UART3
	case e_HAL_UART_3:
		// TODO: 实现UART3波特率和中断配置
		break;
#endif
	default:
		break;
	}
}

/**
 * @brief 关闭UART硬件
 * @param config UART配置结构体指针
 * @note 重置GPIO配置并禁用UART硬件
 */
void Hal_Uartx_Close(s_uartx_config_t *config)
{
	Hal_Gpio_In(&config->gpio_rx);
	Hal_Gpio_Out(&config->gpio_tx, config->level);
	switch (config->index)
	{
#ifdef EN_UART0
	case e_HAL_UART_0:
		// TODO: 实现UART0关闭序列
		break;
#endif
#ifdef EN_UART1
	case e_HAL_UART_1:
		// TODO: 实现UART1关闭序列
		break;
#endif
#ifdef EN_UART2
	case e_HAL_UART_2:
		// TODO: 实现UART2关闭序列
		break;
#endif
#ifdef EN_UART3
	case e_HAL_UART_3:
		// TODO: 实现UART3关闭序列
		break;
#endif
	default:
		break;
	}
}

/**
 * @brief 通过UART发送单个字节
 * @param config UART配置结构体指针
 * @param dat 要发送的字节
 * @note 此函数是中断安全的
 */
void Hal_Uartx_TxByte_Isr(s_uartx_config_t *config, unsigned char dat)
{
	switch (config->index)
	{
#ifdef EN_UART0
	case e_HAL_UART_0:
		// TODO: 实现UART0发送逻辑
		break;
#endif
#ifdef EN_UART1
	case e_HAL_UART_1:
		// TODO: 实现UART1发送逻辑
		break;
#endif
#ifdef EN_UART2
	case e_HAL_UART_2:
		// TODO: 实现UART2发送逻辑
		break;
#endif
#ifdef EN_UART3
	case e_HAL_UART_3:
		// TODO: 实现UART3发送逻辑
		break;
#endif
	default:
		break;
	}
}

/**
 * @brief 通过UART接收单个字节
 * @param config UART配置结构体指针
 * @return 接收到的字节
 * @note 此函数是中断安全的
 */
unsigned char Hal_Uartx_RxByte_Isr(s_uartx_config_t *config)
{
	unsigned char ret = 0;

	switch (config->index)
	{
#ifdef EN_UART0
	case e_HAL_UART_0:
		// TODO: 实现UART0接收逻辑
		break;
#endif
#ifdef EN_UART1
	case e_HAL_UART_1:
		// TODO: 实现UART1接收逻辑
		break;
#endif
#ifdef EN_UART2
	case e_HAL_UART_2:
		// TODO: 实现UART2接收逻辑
		break;
#endif
#ifdef EN_UART3
	case e_HAL_UART_3:
		// TODO: 实现UART3接收逻辑
		break;
#endif
	default:
		break;
	}

	return ret;
}

/**
 * @brief 检查UART发送缓冲区是否为空
 * @param config UART配置结构体指针
 * @return 1表示发送缓冲区为空，0表示不为空
 * @note 此函数是中断安全的
 */
unsigned char Hal_Uartx_Get_TxFlag_Isr(s_uartx_config_t *config)
{
	unsigned char ret = 0;

	switch (config->index)
	{
#ifdef EN_UART0
	case e_HAL_UART_0:
		// TODO: 实现UART0发送标志检查和清除
		break;
#endif
#ifdef EN_UART1
	case e_HAL_UART_1:
		// TODO: 实现UART1发送标志检查和清除
		break;
#endif
#ifdef EN_UART2
	case e_HAL_UART_2:
		// TODO: 实现UART2发送标志检查和清除
		break;
#endif
#ifdef EN_UART3
	case e_HAL_UART_3:
		// TODO: 实现UART3发送标志检查和清除
		break;
#endif
	default:
		break;
	}

	return ret;
}

/**
 * @brief 检查UART接收缓冲区是否有数据
 * @param config UART配置结构体指针
 * @return 1表示有数据，0表示无数据
 * @note 此函数是中断安全的，并会清除接收标志
 */
unsigned char Hal_Uartx_Get_RxFlag_Isr(s_uartx_config_t *config)
{
	unsigned char ret = 0;

	switch (config->index)
	{
#ifdef EN_UART0
	case e_HAL_UART_0:
		// TODO: 实现UART0接收标志检查和清除
		break;
#endif
#ifdef EN_UART1
	case e_HAL_UART_1:
		// TODO: 实现UART1接收标志检查和清除
		break;
#endif
#ifdef EN_UART2
	case e_HAL_UART_2:
		// TODO: 实现UART2接收标志检查和清除
		break;
#endif
#ifdef EN_UART3
	case e_HAL_UART_3:
		// TODO: 实现UART3接收标志检查和清除
		break;
#endif
	default:
		break;
	}

	return ret;
}

#endif
